package cn.org.xwb.bookmall.model.service.impl;

import cn.org.xwb.bookmall.model.constant.ProductConst;
import cn.org.xwb.bookmall.model.po.Authority;
import cn.org.xwb.bookmall.model.po.Product;
import cn.org.xwb.bookmall.model.mapper.ProductMapper;
import cn.org.xwb.bookmall.model.po.ProductLabel;
import cn.org.xwb.bookmall.model.po.ProductParam;
import cn.org.xwb.bookmall.model.service.IProductService;
import cn.org.xwb.bookmall.model.utils.BookRedisUtil;
import cn.org.xwb.bookmall.model.vo.ProductConditionVo;
import cn.org.xwb.bookmall.model.vo.ProductVo;
import cn.org.xwb.common.page.dto.PageResult;
import cn.org.xwb.common.page.utils.PageUtil;
import cn.org.xwb.common.redis.utils.RedisUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Objects;

/**
 * <p>
 * 商品表 服务实现类
 * </p>
 *
 * @author xwb
 * @since 2023-11-27
 */
@Service
public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements IProductService {

    @Autowired
    private RedisUtil redisUtil;

    @Autowired
    private BookRedisUtil bookRedisUtil;

    private String getKeyProduct() {
        return bookRedisUtil.getRedisKeyUser(ProductConst.PRODUCT, "");
    }

    /**
     * 根据 id 查询指定商品的全部相关信息
     *
     * @param id
     * @return
     */
    @Override
    public ProductVo selectProductAllById(Long id) {
        // 获取缓存的全部信息
        List<ProductVo> productVos = findAllFromCache();
        // 找到指定的商品
        for (ProductVo productVo : productVos) {
            if (productVo.getId() == id) return productVo;
        }
        return null;
    }

    /**
     * 查询并缓存所有商品
     *
     * @return null-发生异常
     */
    @Override
    public List<ProductVo> getAllAndCache() {
        // 查询所有商品信息
        List<ProductVo> productVos = baseMapper.selectAll();
        // 缓存
        Boolean res = redisUtil.setList(getKeyProduct(), productVos);
        if (!res) return null;
        return productVos;
    }

    @Override
    public List<ProductVo> findAllFromCache() {
        // 查询缓存
        List<ProductVo> productVos = (List<ProductVo>) redisUtil.get(getKeyProduct());
        // 缓存中不存在
        if (Objects.isNull(productVos)) productVos = getAllAndCache();
        // 发生异常
        if (Objects.isNull(productVos)) return null;
        // 成功
        return productVos;
    }

    @Override
    public PageResult<List<ProductVo>> findProductPage(ProductConditionVo productConditionVo) {
        // 获取全部数据
        List<ProductVo> productVos = findAllFromCache();
        // 异常
        if (Objects.isNull(productVos)) return null;
        // 条件过滤
        if (Objects.nonNull(productConditionVo.getIsRemove()))
            productVos = productVos.stream().filter(productVo -> productVo.getIsRemove() == productConditionVo.getIsRemove()).toList();
        if (Objects.nonNull(productConditionVo.getTitle()) && !productConditionVo.getTitle().isEmpty())
            productVos = productVos.stream().filter(productVo -> productVo.getTitle().contains(productConditionVo.getTitle())).toList();
        if (Objects.nonNull(productConditionVo.getCode()) && !productConditionVo.getCode().isEmpty())
            productVos = productVos.stream().filter(productVo -> productVo.getCode().contains(productConditionVo.getCode())).toList();
        if (Objects.nonNull(productConditionVo.getCategory()))
            productVos = productVos.stream().filter(productVo -> productVo.getProductCategoryId() == productConditionVo.getCategory()).toList();
        if (Objects.nonNull(productConditionVo.getCategorySub()))
            productVos = productVos.stream().filter(productVo -> productVo.getProductCategorySubId() == productConditionVo.getCategorySub()).toList();
        if (Objects.nonNull(productConditionVo.getDelivery()) && !productConditionVo.getDelivery().isEmpty())
            productVos = productVos.stream().filter(productVo -> productVo.getDelivery().contains(productConditionVo.getDelivery())).toList();
        if (Objects.nonNull(productConditionVo.getFreight()))
            productVos = productVos.stream().filter(productVo -> {
                // true，找不包邮的，有邮费的
                if (productConditionVo.getFreight() &&  productVo.getFreight() > 0) return true;
                // false，找包邮的，没有邮费的
                else if (!productConditionVo.getFreight() && productVo.getFreight() == 0) return true;
                return false;
            }).toList();
        if (Objects.nonNull(productConditionVo.getLabel()) && !productConditionVo.getLabel().isEmpty())
            productVos = productVos.stream().filter(productVo -> {
                List<ProductLabel> labels = productVo.getLabels();
                for (ProductLabel label : labels) {
                    if (label.getName().contains(productConditionVo.getLabel())) return true;
                }
                return false;
            }).toList();
        if (Objects.nonNull(productConditionVo.getParam()) && !productConditionVo.getParam().isEmpty())
            productVos = productVos.stream().filter(productVo -> {
                List<ProductParam> params = productVo.getParams();
                for (ProductParam param : params) {
                    if (param.getName().contains(productConditionVo.getParam())) return true;
                }
                return false;
            }).toList();
        // 页数
        Integer pageCnt = PageUtil.getPageCnt(productVos.size(), productConditionVo.getPageSize());
        // 分页数据
        productVos = (List<ProductVo>) PageUtil.getPageData(productVos, productConditionVo.getCurrent(), productConditionVo.getPageSize());
        return new PageResult<>(
                productConditionVo.getCurrent(),
                productConditionVo.getPageSize(),
                productVos.size(), pageCnt, productVos
        );
    }
}
